Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

core/takserver/src/commonMain/kotlin/org/meshtastic/core/takserver/TAKPacketConversion.kt cea2c3a015c2c3227f13a3ac9bc4e13c35bbd4ee (cea2c3a0) Text, 7.58 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffReturnCountTa5d6ff"Tb4b4b4)

Tff7b72package T7ee787org.meshtastic.core.takserver

Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787org.meshtastic.proto.Contact
Tff7b72import T7ee787org.meshtastic.proto.GeoChat
Tff7b72import T7ee787org.meshtastic.proto.Group
Tff7b72import T7ee787org.meshtastic.proto.MemberRole
Tff7b72import T7ee787org.meshtastic.proto.PLI
Tff7b72import T7ee787org.meshtastic.proto.Status
Tff7b72import T7ee787org.meshtastic.proto.TAKPacket
Tff7b72import T7ee787org.meshtastic.proto.Team
Tff7b72import T7ee787kotlin.random.Random
Tff7b72import T7ee787kotlin.time.Clock
Tff7b72import T7ee787kotlin.time.Duration.Companion.minutes

T8b949e/**
* Legacy v1 CoT <-> TAKPacket conversion for firmware <= 2.7.x.
*
* Wire format: bare protobuf-encoded [TAKPacket] on `ATAK_PLUGIN` port 72, no zstd compression (the proto has an
* `is_compressed` flag but the firmware doesn't act on it). Supports only PLI and GeoChat payloads — shape, marker,
* route, casevac, emergency, and task CoT events return null and are dropped.
*
* For the SDK-backed path that handles all payload types with zstd dictionary compression on `ATAK_PLUGIN_V2` port 78,
* see [TAKPacketV2Conversion].
*
* [TAKMeshIntegration] picks between the two paths based on `Capabilities.supportsTakV2` (firmware >= 2.8.0).
*/
Tff7b72object T56d364TAKPacketConversion Tb4b4b4{

Tff7b72fun Te6edf3CoTMessageTb4b4b4.Td2a8fftoTAKPacketTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3TAKPacket? Tb4b4b4{
Tff7b72val Te6edf3group Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3groupTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3GroupTb4b4b4(
Te6edf3role Tff7b72=
Te6edf3MemberRoleTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3TakConversionHelpersTb4b4b4.Te6edf3getMemberRoleValueTb4b4b4(Tffa657itTb4b4b4.Te6edf3roleTb4b4b4)Tb4b4b4) Tff7b72?: Te6edf3MemberRoleTb4b4b4.Te6edf3UnspecifedTb4b4b4,
Te6edf3team Tff7b72= Te6edf3TeamTb4b4b4.Te6edf3fromValueTb4b4b4(Te6edf3TakConversionHelpersTb4b4b4.Te6edf3getTeamValueTb4b4b4(Tffa657itTb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4) Tff7b72?: Te6edf3TeamTb4b4b4.Te6edf3Unspecifed_ColorTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3status Tff7b72= Tff7b72thisTb4b4b4.Te6edf3statusTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3StatusTb4b4b4(Te6edf3battery Tff7b72= Tffa657itTb4b4b4.Te6edf3batteryTb4b4b4.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3typeTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffa-f-GTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3typeTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffa-f-gTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3createPliPacketTb4b4b4(Te6edf3groupTb4b4b4, Te6edf3statusTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3type Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffb-t-fTa5d6ff"Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3createChatPacketTb4b4b4(Te6edf3groupTb4b4b4, Te6edf3statusTb4b4b4)
Tb4b4b4}

Te6edf3LoggerTb4b4b4.Te6edf3w Tb4b4b4{ Ta5d6ff"Ta5d6ffCannot convert CoT to TAKPacket for type Tffd700$Te6edf3typeTa5d6ff" Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3CoTMessageTb4b4b4.Td2a8ffcreatePliPacketTb4b4b4(Te6edf3groupTb4b4b4: Te6edf3Group?Tb4b4b4, Te6edf3statusTb4b4b4: Te6edf3Status?Tb4b4b4)Tb4b4b4: Te6edf3TAKPacket Tb4b4b4{
Tff7b72val Te6edf3contact Tff7b72= Tff7b72thisTb4b4b4.Te6edf3contactTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3ContactTb4b4b4(Te6edf3callsign Tff7b72= Tffa657itTb4b4b4.Te6edf3callsignTb4b4b4, Te6edf3device_callsign Tff7b72= Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3pli Tff7b72=
Te6edf3PLITb4b4b4(
Te6edf3latitude_i Tff7b72= Tb4b4b4(Te6edf3latitude Tff7b72* Te6edf3TAK_COORDINATE_SCALETb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3longitude_i Tff7b72= Tb4b4b4(Te6edf3longitude Tff7b72* Te6edf3TAK_COORDINATE_SCALETb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3altitude Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hae Tff7b72>Tff7b72= Te6edf3TAK_UNKNOWN_POINT_VALUE Tff7b72|Tff7b72| Te6edf3haeTb4b4b4.Te6edf3isNaNTb4b4b4(Tb4b4b4)Tb4b4b4) T79c0ff0 Tff7b72else Te6edf3haeTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3speed Tff7b72= Te6edf3trackTff7b72?.Te6edf3speedTff7b72?.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0.0Tb4b4b4)Tff7b72?.Te6edf3toIntTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3course Tff7b72= Te6edf3trackTff7b72?.Te6edf3courseTff7b72?.Te6edf3coerceAtLeastTb4b4b4(T79c0ff0.0Tb4b4b4)Tff7b72?.Te6edf3toIntTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4,
Tb4b4b4)

Tff7b72return Te6edf3TAKPacketTb4b4b4(Te6edf3is_compressed Tff7b72= Tff7b72falseTb4b4b4, Te6edf3contact Tff7b72= Te6edf3contactTb4b4b4, Te6edf3group Tff7b72= Te6edf3groupTb4b4b4, Te6edf3status Tff7b72= Te6edf3statusTb4b4b4, Te6edf3pli Tff7b72= Te6edf3pliTb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Te6edf3CoTMessageTb4b4b4.Td2a8ffcreateChatPacketTb4b4b4(Te6edf3groupTb4b4b4: Te6edf3Group?Tb4b4b4, Te6edf3statusTb4b4b4: Te6edf3Status?Tb4b4b4)Tb4b4b4: Te6edf3TAKPacket? Tb4b4b4{
Tff7b72val Te6edf3localChat Tff7b72= Tff7b72thisTb4b4b4.Te6edf3chat Tff7b72?: Tff7b72return Tff7b72null
Tff7b72val Te6edf3chatMsg Tff7b72= Te6edf3localChatTb4b4b4.Te6edf3message
Tff7b72var Te6edf3toUidTb4b4b4: Tffa657String? Tff7b72= Tff7b72null
Tff7b72var Te6edf3toCallsignTb4b4b4: Tffa657String? Tff7b72= Tff7b72null

Tff7b72val Te6edf3actualDeviceUid Tff7b72= Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4.Te6edf3geoChatSenderUidTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3messageId Tff7b72=
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffGeoChat.Ta5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4.Te6edf3geoChatMessageIdTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Te6edf3TAK_HEX_RADIXTb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3contact Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3contactTff7b72?.Te6edf3let Tb4b4b4{
Tff7b72val Te6edf3smuggledCallsign Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3actualDeviceUidTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Ta5d6ff"Tffd700$Te6edf3actualDeviceUidTa5d6ff|Tffd700$Te6edf3messageIdTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3endpoint Tff7b72?: Ta5d6ff"Ta5d6ff"
Tb4b4b4}
Te6edf3ContactTb4b4b4(Te6edf3callsign Tff7b72= Tffa657itTb4b4b4.Te6edf3callsignTb4b4b4, Te6edf3device_callsign Tff7b72= Te6edf3smuggledCallsignTb4b4b4)
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3localChatTb4b4b4.Te6edf3chatroomTb4b4b4.Te6edf3startsWithTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4) Tff7b72|Tff7b72| Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffGeoChatTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3parts Tff7b72= Tff7b72thisTb4b4b4.Te6edf3uidTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3partsTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3TAK_DIRECT_MESSAGE_PARTS_MIN Tff7b72&Tff7b72& Te6edf3partsTff7b72[T79c0ff0Tff7b72] Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffGeoChatTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3toUid Tff7b72= Te6edf3localChatTb4b4b4.Te6edf3chatroom
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3localChatTb4b4b4.Te6edf3chatroom Tff7b72!Tff7b72= Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3toCallsign Tff7b72= Te6edf3localChatTb4b4b4.Te6edf3chatroom
Tb4b4b4}

Tff7b72val Te6edf3chat Tff7b72=
Te6edf3GeoChatTb4b4b4(
Te6edf3message Tff7b72= Te6edf3chatMsgTb4b4b4,
Te6edf3to Tff7b72= Te6edf3toUid Tff7b72?: Tff7b72if Tb4b4b4(Te6edf3toCallsign Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff" Tff7b72else Tff7b72nullTb4b4b4,
Te6edf3to_callsign Tff7b72= Te6edf3toCallsignTb4b4b4,
Tb4b4b4)

Tff7b72return Te6edf3TAKPacketTb4b4b4(Te6edf3is_compressed Tff7b72= Tff7b72falseTb4b4b4, Te6edf3contact Tff7b72= Te6edf3contactTb4b4b4, Te6edf3group Tff7b72= Te6edf3groupTb4b4b4, Te6edf3status Tff7b72= Te6edf3statusTb4b4b4, Te6edf3chat Tff7b72= Te6edf3chatTb4b4b4)
Tb4b4b4}

Tff7b72fun Te6edf3TAKPacketTb4b4b4.Td2a8fftoCoTMessageTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3CoTMessage? Tb4b4b4{
Tff7b72val Te6edf3rawDeviceCallsign Tff7b72= Te6edf3contactTff7b72?.Te6edf3device_callsign Tff7b72?: Ta5d6ff"Ta5d6ffUNKNOWNTa5d6ff"
Tff7b72val Te6edf3senderCallsign Tff7b72= Te6edf3contactTff7b72?.Te6edf3callsign Tff7b72?: Ta5d6ff"Ta5d6ffUNKNOWNTa5d6ff"
Tff7b72val Te6edf3timeNow Tff7b72= Te6edf3ClockTb4b4b4.Te6edf3SystemTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3staleTime Tff7b72= Te6edf3timeNow Tff7b72+ Te6edf3DEFAULT_TAK_STALE_MINUTESTb4b4b4.Te6edf3minutes

Tff7b72val Tb4b4b4(Te6edf3senderUidTb4b4b4, Te6edf3messageIdTb4b4b4) Tff7b72= Te6edf3TakConversionHelpersTb4b4b4.Te6edf3parseDeviceCallsignTb4b4b4(Te6edf3rawDeviceCallsignTb4b4b4)

Tff7b72val Te6edf3localPli Tff7b72= Te6edf3pli
Tff7b72if Tb4b4b4(Te6edf3localPli Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3CoTMessageTb4b4b4.Te6edf3pliTb4b4b4(
Te6edf3uid Tff7b72= Te6edf3senderUidTb4b4b4,
Te6edf3callsign Tff7b72= Te6edf3senderCallsignTb4b4b4,
Te6edf3latitude Tff7b72= Te6edf3localPliTb4b4b4.Te6edf3latitude_iTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3TAK_COORDINATE_SCALETb4b4b4,
Te6edf3longitude Tff7b72= Te6edf3localPliTb4b4b4.Te6edf3longitude_iTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3TAK_COORDINATE_SCALETb4b4b4,
Te6edf3altitude Tff7b72= Te6edf3localPliTb4b4b4.Te6edf3altitudeTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3speed Tff7b72= Te6edf3localPliTb4b4b4.Te6edf3speedTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3course Tff7b72= Te6edf3localPliTb4b4b4.Te6edf3courseTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3team Tff7b72= Te6edf3TakConversionHelpersTb4b4b4.Te6edf3teamToColorNameTb4b4b4(Te6edf3groupTff7b72?.Te6edf3teamTb4b4b4)Tb4b4b4,
Te6edf3role Tff7b72= Te6edf3TakConversionHelpersTb4b4b4.Te6edf3roleToNameTb4b4b4(Te6edf3groupTff7b72?.Te6edf3roleTb4b4b4)Tb4b4b4,
Te6edf3battery Tff7b72= Te6edf3statusTff7b72?.Te6edf3battery Tff7b72?: Te6edf3DEFAULT_TAK_BATTERYTb4b4b4,
Te6edf3staleMinutes Tff7b72= Te6edf3DEFAULT_TAK_STALE_MINUTESTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3localChat Tff7b72= Te6edf3chat
Tff7b72if Tb4b4b4(Te6edf3localChat Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3chatroom Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3localChatTb4b4b4.Te6edf3to Tff7b72!Tff7b72= Tff7b72null Tff7b72|Tff7b72| Te6edf3localChatTb4b4b4.Te6edf3to_callsign Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3localChatTb4b4b4.Te6edf3to_callsign Tff7b72?: Te6edf3localChatTb4b4b4.Te6edf3to Tff7b72?: Ta5d6ff"Ta5d6ffDirect MessageTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ffAll Chat RoomsTa5d6ff"
Tb4b4b4}

Tff7b72val Te6edf3msgId Tff7b72= Te6edf3messageId Tff7b72?: Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toStringTb4b4b4(Te6edf3TAK_HEX_RADIXTb4b4b4)

Tff7b72return Te6edf3CoTMessageTb4b4b4(
Te6edf3uid Tff7b72= Ta5d6ff"Ta5d6ffGeoChat.Tffd700$Te6edf3senderUidTa5d6ff.Tffd700$Te6edf3chatroomTa5d6ff.Tffd700$Te6edf3msgIdTa5d6ff"Tb4b4b4,
Te6edf3type Tff7b72= Ta5d6ff"Ta5d6ffb-t-fTa5d6ff"Tb4b4b4,
Te6edf3how Tff7b72= Ta5d6ff"Ta5d6ffh-g-i-g-oTa5d6ff"Tb4b4b4,
Te6edf3time Tff7b72= Te6edf3timeNowTb4b4b4,
Te6edf3start Tff7b72= Te6edf3timeNowTb4b4b4,
Te6edf3stale Tff7b72= Te6edf3staleTimeTb4b4b4,
Te6edf3latitude Tff7b72= T79c0ff0.0Tb4b4b4,
Te6edf3longitude Tff7b72= T79c0ff0.0Tb4b4b4,
Te6edf3contact Tff7b72= Te6edf3CoTContactTb4b4b4(Te6edf3callsign Tff7b72= Te6edf3senderCallsignTb4b4b4, Te6edf3endpoint Tff7b72= Te6edf3DEFAULT_TAK_ENDPOINTTb4b4b4)Tb4b4b4,
Te6edf3group Tff7b72=
Te6edf3CoTGroupTb4b4b4(
Te6edf3name Tff7b72= Te6edf3TakConversionHelpersTb4b4b4.Te6edf3teamToColorNameTb4b4b4(Te6edf3groupTff7b72?.Te6edf3teamTb4b4b4)Tb4b4b4,
Te6edf3role Tff7b72= Te6edf3TakConversionHelpersTb4b4b4.Te6edf3roleToNameTb4b4b4(Te6edf3groupTff7b72?.Te6edf3roleTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3CoTStatusTb4b4b4(Te6edf3battery Tff7b72= Te6edf3statusTff7b72?.Te6edf3battery Tff7b72?: Te6edf3DEFAULT_TAK_BATTERYTb4b4b4)Tb4b4b4,
Te6edf3chat Tff7b72= Te6edf3CoTChatTb4b4b4(Te6edf3chatroom Tff7b72= Te6edf3chatroomTb4b4b4, Te6edf3senderCallsign Tff7b72= Te6edf3senderCallsignTb4b4b4, Te6edf3message Tff7b72= Te6edf3localChatTb4b4b4.Te6edf3messageTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72return Tff7b72null
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.14s